<?php
/**
 * 厨师-执行者
 * CLI 运行-无需命名空间
 * 2019年12月29日19:43:58
 */
ini_set('memory_limit',-1);
class Executor
{
    // 命令储存位置
    public $command_book = __DIR__.'/Command.json.txt';
    // 执行操作、$index读取位置
    public function run()
    {
        // 只读打开文件
        $file_handle = fopen($this -> command_book,'r');
        // 读写打开文件
        $file_handle_for_edit = fopen($this -> command_book,'r+');
        // 循环读取
        while(!feof($file_handle)){
            // 获取当前位置
            $index = ftell($file_handle);
            // 读取一行
            $command = trim(fgets($file_handle));
            $command = trim($command,',');
            if(empty($command)){
                break;
            }
            $command = json_decode($command);
            if($command[0] === 0 || $command[0] === 3){
                echo "{$command[1]}，正在倒酒/烧烤...";
                sleep(3);
                $command[0] = 1;
                $command[2] = '已完成';
                echo "{$command[1]}，{$command[2]}\n";
                // 定位当前位置、然后修改
                fseek($file_handle_for_edit,$index);
                // 替换操作，【特别注意：[未完成] 与 [已完成] 字符串长度必须相等，即替换前后的字符串长度必须相等，否则替换会出错】
                fwrite($file_handle_for_edit,json_encode($command).",\n"); # 关键：fwrite 替换的是当前定位的下一行
                sleep(1);
            }
        }
        // 获取当前时间，如果当前时间大于等于 2300 则下班
        $current_time = date('H:i');
        if($current_time >= 2300){
            return false;
        }
        fclose($file_handle);
        fclose($file_handle_for_edit);
        $this -> run();
    }
}
// 实例化执行者
$executor = new Executor();
$executor -> run();
